package DisciplinaTopicoView;

import DisciplinaTopico.Topico;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

/**
 * Classe personalizada que permite que os itens de uma JList sejam exibidos
 * com uma JCheckBox ao lado
 *
 * @author André Caglianone
 */
public class FrameListaTopico extends JFrame
{
    private JList listaTopicos;

    @SuppressWarnings("element-type-mismatch")
    public FrameListaTopico(String titulo, java.util.List<Topico> topicos, java.util.List<Topico> topicosPreSelecionados, final ITopicosCallback topicosCallback)
    {
        super(titulo);
        
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        listaTopicos = new JList();

        Container container = getContentPane();
        container.setLayout(new FlowLayout(FlowLayout.CENTER));

        listaTopicos.setCellRenderer(new CheckBoxCellRenderer());
        
        java.util.List<Object> checkBoxes = new java.util.ArrayList<Object>();
        for (Topico topico : topicos)
        {
            boolean seleciona = topicosPreSelecionados.contains(topico);

            checkBoxes.add(criaNovoCheckBox(topico.toString(), topico, seleciona));
        }

        listaTopicos.setListData(checkBoxes.toArray());
        listaTopicos.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

        //Listener para o evento mousePressed
        listaTopicos.addMouseListener(new MouseAdapter()
        {
            public void mousePressed(MouseEvent e)
            {
                int index = listaTopicos.locationToIndex(e.getPoint());
                if(index != -1)
                {
                    CheckBoxEspecializado checkbox = (CheckBoxEspecializado) listaTopicos.getModel().getElementAt(index);
                    checkbox.setSelected(!checkbox.isSelected());
                    repaint();
                }
            }
        });

        // Botão que salva as alterações
        final JButton btnSalvar = new JButton("Salvar");

        final java.util.List<Topico> topicosSelecionados = new java.util.ArrayList<Topico>();
        btnSalvar.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                for(int i = 0; i < listaTopicos.getModel().getSize(); i++)
                {
                    CheckBoxEspecializado checkbox = (CheckBoxEspecializado)listaTopicos.getModel().getElementAt(i);
                    if(checkbox.isSelected())
                    {
                        topicosSelecionados.add((Topico)checkbox.getObjetoArmazenado());
                    }
                }

                disposeView();

                topicosCallback.onSelecaoTerminada(topicosSelecionados);
            }
        });

        container.add(new JScrollPane(listaTopicos));
        container.add(btnSalvar);
        
        setSize(400, 200);
    }

    private void disposeView()
    {
        this.dispose();
    }

    private CheckBoxEspecializado criaNovoCheckBox(String texto, Object objeto, boolean seleciona)
    {
        CheckBoxEspecializado chk = new CheckBoxEspecializado();

        chk.setText(texto);
        chk.setObjetoArmazenado(objeto);
        chk.setSelected(seleciona);

        return  chk;
    }
}

class CheckBoxCellRenderer implements ListCellRenderer
{
    Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);

    public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
    {
        JCheckBox checkbox = (JCheckBox)value;
        
        checkbox.setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
        checkbox.setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
        checkbox.setEnabled(list.isEnabled());
        checkbox.setFont(list.getFont());
        checkbox.setFocusPainted(false);
        checkbox.setBorderPainted(true);
        checkbox.setBorder(isSelected ? UIManager.getBorder("List.focusCellHighlightBorder") : noFocusBorder);

        return checkbox;
    }
}

class CheckBoxEspecializado extends JCheckBox
{
    private Object objetoArmazenado;

    public CheckBoxEspecializado()
    {
        super();
    }

    public void setObjetoArmazenado(Object objeto)
    {
        this.objetoArmazenado = objeto;
    }

    public Object getObjetoArmazenado()
    {
        return this.objetoArmazenado;
    }
}

